package com.cskaoyan.javase.oop1._13block._1building;
/**
 * 构造代码块
 * 语法:{}
 * 定义位置: 类体中的成员位置
 * 构造代码块的作用:
 * 随着构造器的执行而执行，用于在创建对象过程当中，给成员变量赋值！！
 * 构造代码块的作用和构造器基本是一样的,也是用来赋值的
 *
 * 现在,关于new对象过程中,成员变量的赋值手段,有:
 *      1.默认初始化具有默认值
 *      2.显式赋值
 *      3.构造器赋值
 *      4.构造代码块赋值
 * 其中,默认初始化最先执行,构造器最后执行
 * 而(重点)构造代码块赋值和显式赋值是按照在代码中的书写顺序,从上到下执行
 * 后执行的会覆盖掉先执行的结构
 *
 * 构造代码块总结:
 *      1.在new对象过程中执行,只要是该类的构造器执行了,那么构造代码块一定随之执行
 *          而且一定在构造器之前执行
 *      2.构造代码块和显式赋值按照代码书写顺序,从上到下执行
 *      3.构造代码块赋值和显式赋值在一次new对象的过程中,最多执行一次,而且肯定执行一次
 *
 * 构造代码块的原理:
 * 在代码编译过程中,编译器会自动去掉代码中的构造代码块
 * 将构造代码块中的代码,以及显式赋值代码,智能地放入构造器中
 * 所谓智能是为了保证:
 *      按照代码的书写顺序从上到下执行构造代码块代码以及显式赋值代码
 *
 * 而且在这个过程中:
 *      构造代码块中的代码总是放到类中所有构造器代码的前几行
 *      这意味着:
 *          1.无论使用哪个构造器new对象赋值,构造代码块都会执行
 *          2.构造代码块代码一定先于构造器代码执行
 *
 * 构造代码块总结:
 *      1.(重点)构造代码块赋值和显式赋值是按照在代码中的书写顺序,从上到下执行
 *      2.(了解)上述实现的原理,是编译器通过将不同代码放入构造器中实现的,编译后的代码没有构造代码块的结构.
 *      3.(重点)new对象,构造器一定执行,构造代码也随之执行.但是new一个对象,构造代码块仅执行一次.
 *              无论执行哪个构造器,构造代码块都会执行
 *      4.(重点)构造代码块先于构造器执行
 *
 * 注意事项:
 *      1.建议应该将构造代码块，放在成员变量的声明和显式赋值语句的下面
 *      2.构造代码块中是可以用this的,但是this仅能表示当前对象,不能用于调用构造器
 *
 * @since 17:11
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(38);
        System.out.println(s.age);
    }
}
class Student{

    // 构造代码块
    {
        this.age = 18;
        test();
        // this();
        System.out.println("hello world!");
    }

    int age = 28;

    public Student() {
    }

    public Student(int age) {
        // this();
        this.age = age;
    }

    public void test(){}
}
